
package com.rinvaylabs.utils;

import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * IP address utility functions
 *
 */
public class IpAddressUtils {
    
    /**
     * Returns the local IP address
     *
     * @return IP address
     */
    public static String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); (en != null) && en.hasMoreElements();) {
                NetworkInterface intf = (NetworkInterface)en.nextElement();
                for (Enumeration<InetAddress> addr = intf.getInetAddresses(); addr.hasMoreElements();) {
                    InetAddress inetAddress = (InetAddress)addr.nextElement();
                    if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
                        return IpAddressUtils.extractHostAddress(inetAddress.getHostAddress());
                    }
                }
            }
            return null;
        } catch(Exception e) {
            return null;
        }
    }

    /**
     * Extract host address (see RFC4007 and RFC2373)
     *
     * @param host Host address
     * @return Address
     */
    public static String extractHostAddress(String host) {
        if (host == null) {
            return null;
        }

        // Remove prefix from address
        int index = host.indexOf("/");
        if (index != -1) {
            host = host.substring(0, index);
        }

        // Remove zone id from address
        /*
         * RFC4007:
         * <address>%<zone_id> where: 
         * <address> is a literal IPv6 address, 
         * <zone_id> is a string identifying the zone of the address,
         * and `%' is a delimiter character to distinguish between <address> and <zone_id>.
         */
        index = host.indexOf("%");
        if (index != -1) {
            host = host.substring(0, index);
        }

        return host;
    }

    /**
     * is IPv6 Address
     *
     * @param ipAddress address
     * @return true if IPv6
     */
    public static boolean isIPv6(String ipAddress) {
        InetAddress addr;
        boolean isIPv6 = false;
        try {
            addr = InetAddress.getByName(ipAddress);
            isIPv6 = addr instanceof Inet6Address;
        } catch (UnknownHostException e) {
            return false;
        }
        return isIPv6;
    }
    
    public static void main(String [] args) {
        System.out.println(getLocalIpAddress());
    }
}
